const jwt = require('jsonwebtoken');
const { ACCESS_TOKEN_SECRET } = require('../config/jwt');
const User = require('../models/User');

module.exports = async (req, res, next) => {
  try {
    const authHeader = req.headers['authorization'];
    if (!authHeader) {
      return res.status(401).json({ code: 401, msg: '未提供认证令牌' });
    }

    const token = authHeader.replace('Bearer ', '');
    if (!token) {
      return res.status(401).json({ code: 401, msg: '无效的认证令牌格式' });
    }

    const decoded = jwt.verify(token, ACCESS_TOKEN_SECRET);
    if (!decoded || !decoded.id) {
      return res.status(401).json({ code: 401, msg: '无效的令牌内容' });
    }

    // 推荐写法：直接用字符串 id 查询，Mongoose 会自动转换
    const user = await User.findById(decoded.id);
    if (!user) {
      return res.status(401).json({ code: 401, msg: '用户不存在' });
    }

    if (!user.status) {
      return res.status(403).json({ code: 403, msg: '用户已被禁用' });
    }

    req.user = user;
    next();
  } catch (error) {
    console.error('[认证中间件] 错误:', error);

    if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({ code: 401, msg: '无效的令牌' });
    }
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({ code: 401, msg: '令牌已过期' });
    }
    if (error.name === 'CastError') {
      return res.status(401).json({ code: 401, msg: '无效的用户ID格式' });
    }

    return res.status(500).json({ code: 500, msg: '服务器内部错误' });
  }
};